#include "thread_array.h"
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <mqueue.h>
#include <sys/types.h>

// 队列路径
#define MQ_NAME "/thread_array"
// 声明消息队列
static mqd_t queue_fd;
// 用来存放线程标识符的数字
static pthread_t *thread_array = NULL;
// 用来保存线程数量的变量
static int thread_number = 0;

//子线程
void *thread_handble(void *argv)
{
    Task task;
    while(1)
    {
        ssize_t result =  mq_receive(queue_fd,(char *)&task,sizeof(Task),0);
        //判断是否接收成功
        if(result == -1)
        {
            //失败
            continue;
        }
        //成功
        task.task_func(task.argv);

    }
}

//线程池初始化
int Thread_Array_Init(int number)
{
    // 创建队列
    struct mq_attr attr;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = sizeof(Task);
    queue_fd = mq_open(MQ_NAME, O_RDWR | O_CREAT, 0644, &attr);
    // 判断是否创建成功
    if (queue_fd == -1)
    {
        perror("队列创建失败");
        return -1;
    }

    // 给线程标识符分配空间存放
    thread_number = number;
    thread_array = malloc(sizeof(pthread_t) * thread_number);

    // 判断是否分配成功
    if (thread_array == NULL)
    {
        printf("线程池内存分配失败\n");
        // 删除队列
        mq_unlink(MQ_NAME);
        return -1;
    }

    // 创建子线程
    for (int i = 0; i < thread_number; i++)
    {
        int result = pthread_create(thread_array + i, NULL, thread_handble, NULL);
        // 判断是否创建失败
        if (result != 0)
        {
            // 线程创建失败
            printf("第%d个线程创建失败\n", i);
            // 删除队列
            mq_unlink(MQ_NAME);
            return -1;
        }
    }

    return 0;
}

int Thread_RegisterTask(Task *task)
{
    //注册任务
    int result = mq_send(queue_fd,(char *)task,sizeof(Task),0);
    return result;
}

void Thread_close(void)
{
    //清除队列
    mq_unlink(MQ_NAME);
    //关闭子进程
    for(int i = 0 ; i < thread_number ;i++)
    {
        pthread_cancel(thread_array[i]);
        pthread_join(thread_array[i],NULL);
    }
    //释放内存
    free(thread_array);
}
